package com.adee.nowcoder.huawei;

import java.util.*;

/**
 * 描述
 * 数据表记录包含表索引index和数值value（int范围的正整数），请对表索引相同的记录进行合并，即将相同索引的数值进行求和运算，输出按照index值升序进行输出。
 *
 *
 * 提示:
 * 0 <= index <= 11111111
 * 1 <= value <= 100000
 *
 * 输入描述：
 * 先输入键值对的个数n（1 <= n <= 500）
 * 接下来n行每行输入成对的index和value值，以空格隔开
 *
 * 输出描述：
 * 输出合并后的键值对（多行）
 *
 * 示例1
 * 输入：
 * 4
 * 0 1
 * 0 2
 * 1 2
 * 3 4
 * 复制
 * 输出：
 * 0 3
 * 1 2
 * 3 4
 *
 * 这道题目很简单，但面试喜欢问(去年大四校招深信服面试过类似的（现在是研究僧）。
 * 这题的重点在于查找时间和存储空间的处理即数据结构的选取。
 * 到底是map还是数组还是哈希表可以根据key的范围以及key-value对的个数选取。
 * 1：如果key取值范围小，那么数组是最合适的。但本题不适合，因为并没有给出key的范围，如果key很大
 * 如Integer.MAX-1，那么直接开一个这么大的数组会崩的的
 * 2：如果key的取值范围很大，但是key的个数少，那么哈希表比较合适
 * 3：如果key的取值范围很大而且key的个数很多，那么tree是比较合适的。本题目适合tree。
 *
 *
 * 使用HashMap或TreeMap，此处使用TreeMap，需要按key排序
 */
public class T008_HJ8 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            int n = Integer.parseInt(in.nextLine());
            Map<Integer,Integer> map = new HashMap<>();
            for(int i = 0; i < n; i++) {
                String s = in.nextLine();
                String[] arr = s.split(" ");
                int index = Integer.parseInt(arr[0]);
                int value = Integer.parseInt(arr[1]);
                if(map.containsKey(index)) {
                    Integer v = map.get(index);
                    map.put(index, map.get(index) + value);
                } else {
                    map.put(index, value);
                }
            }
            List<Integer> list = new ArrayList<>();
            list.addAll(map.keySet());
            list.sort((a,b)->a-b);
            for(Integer i : list) {
                System.out.println(i + " " + map.get(i));
            }
        }
    }
}
